/**
 * @Project: Runer
 * @Title: Xmpp.java
 * @Package com.runlooker.runer.asmack
 * @author YINENG
 * @date 2014-7-18 上午9:56:00
 * @Copyright: 2014 www.yineng.com.cn Inc. All rights reserved.
 * @version V1.0
 */
package com.runlooker.runer.asmack;

import java.util.Collection;
import java.util.Map;

import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;

import com.runlooker.runer.entity.ChatMsgEntity;
import com.runlooker.runer.entity.LocalRosterEntity;
import com.runlooker.runer.entity.PersonInfoEntity;

/**
 * @ClassName Xmpp
 * @Description 模块描述
 * @author town
 * @Date 2014-7-18
 */
public interface Asmack {

	public Presence getPresenceOfAccount(String Account);

	/**
	 * 
	 * 发送个人聊天信息
	 * 
	 * @param entity
	 * @return
	 * @throws XMPPException
	 */
	public Message sendChatMessage(ChatMsgEntity entity) throws XMPPException;

	public LocalRosterEntity getRosterByAccount(String account);

	/**
	 * 
	 * 返回null或者XMPPConnection实例
	 * 
	 * @return
	 */
	public XMPPConnection getConnect();

	/**
	 * 发送消息包
	 * 
	 * @param packet
	 */
	public void sendPacket(Packet packet);

	/**
	 * 
	 * 
	 * 登陆
	 * 
	 * @Title: login
	 * @Description: 方法描述
	 * @param account
	 * @param password
	 * @return
	 */
	public void login(final String account, final String password)
			throws Exception;

	/**
	 * 
	 * 注册帐号
	 * 
	 * @Title: register
	 * @Description: 方法描述
	 * @param account
	 * @param password
	 * @param attributes
	 * @return
	 */
	public void register(String account, String password,
			Map<String, String> attributes) throws Exception;

	/**
	 * 
	 * 注销登陆,并且注销联系人更改的监听、ping服务器的监听、消息监听
	 * 
	 * @Title: logout
	 * @Description: 方法描述
	 * @return
	 */
	public void logout() throws XMPPException;

	/**
	 * 
	 * 是否已登录
	 * 
	 * @Title: isAuthenticated
	 * @Description: 方法描述
	 * @return
	 */
	public boolean isAuthenticated();

	/**
	 * 
	 * 搜索帐号,返回搜索的帐号，则标识服务器有该帐号，返回null则表示没有该帐号。抛出异常标识搜索失败
	 * 
	 * @Title: searchAccount
	 * @Description: 方法描述
	 * @param account
	 * @return
	 */
	public String searchAccount(String account) throws Exception;

	/**
	 * 
	 * 
	 * 添加好友,抛出异常则是添加失败
	 * 
	 * @Title: addRosterItem
	 * @Description: 方法描述
	 * @param user
	 * @param alias
	 * @param group
	 * @throws XMPPException
	 */
	public void addRosterItem(String user, String alias) throws XMPPException;

	/**
	 * 
	 * 删除好友,抛出异常是因为删除用户失败
	 * 
	 * @Title: removeRosterItem
	 * @Description: 方法描述
	 * @param user
	 * @throws XMPPException
	 */
	public void removeRosterItem(String account) throws XMPPException;

	/**
	 * 
	 * 修改好友昵称,抛出异常则是因为传入的jid不正确
	 * 
	 * @Title: renameRosterItem
	 * @Description: 方法描述
	 * @param user
	 * @param newName
	 * @throws XMPPException
	 */
	public void renameRosterItem(String oldName, String newName)
			throws XMPPException;

	/**
	 * 
	 * 移动好友到新分组
	 * 
	 * @Title: moveRosterItemToGroup
	 * @Description: 方法描述
	 * @param user
	 * @param group
	 */
	public void moveRosterItemToGroup(String user, String group)
			throws XMPPException;

	/**
	 * 发送离线消息
	 * 
	 * @Title: sendOfflineMessages
	 * @Description: 方法描述
	 */
	public void sendOfflineMessages();

	/**
	 * 获得联系人列表
	 * 
	 * @return 返回Collection<RosterEntry> 或者 null
	 */
	public Collection<RosterEntry> getEntities();

	/**
	 * 重命名分组
	 * 
	 * @Title: renameRosterGroup
	 * @Description: 方法描述
	 * @param group
	 * @param newGroup
	 */
	public void renameRosterGroup(String group, String newGroup);

	/**
	 * 请求好友重新授权，用在添加好友失败时，重复添加 再次向对方发出申请
	 * 
	 * @Title: requestAuthorizationForRosterItem
	 * @Description: 方法描述
	 * @param user
	 */
	public void requestAuthorizationForRosterItem(String user);

	/**
	 * 添加新分组
	 * 
	 * @Title: addRosterGroup
	 * @Description: 方法描述
	 * @param group
	 */
	public void addRosterGroup(String group);

	/**
	 * 
	 * 删除分组
	 * 
	 * @Title: removeRosterGroup
	 * @Description: 方法描述
	 * @param group
	 */
	public void removeRosterGroup(String group);

	/**
	 * 
	 * 保存用户信息和手机信息到服务器
	 * 
	 * @param info
	 */
	public void savePersonInfo(PersonInfoEntity info) throws XMPPException;

	/**
	 * 
	 * 从服务器获得当前登录用户的电子名片
	 * 
	 * @return
	 */
	public PersonInfoEntity getOurPersonInfo() throws XMPPException;

	/**
	 * 
	 * 获得指定帐号的电子名片,返回PersonInfo实例，或者null
	 * 
	 * @return
	 */
	public PersonInfoEntity getPersonInfoByAccount(String Account)
			throws XMPPException;

}
